import Request from 'luch-request'
import { BASE_URL } from '@/common/config'
import { fastModal, fastToast } from '@/common'

const http = new Request()

/**
  * @description 修改全局默认配置
  * @param {Function}   
*/
http.setConfig((config) => { // config 为默认全局配置
  config.baseURL = BASE_URL /* 根域名 */
  // #ifdef H5
  config.withCredentials = true
  // #endif
  config.header = {}
  // 演示自定义参数, 拦截器可以接收
  // request - config.custom.auth
  // response - response.config.auth
  // config.custom.auth = true
  config.timeout = 30000
  config.custom = { auth: false }
  return config
  // 局部config优先级高于全局
})

http.interceptors.request.use((config) => {
  // 可使用async await 做异步操作
  config.header = {
    ...config.header,
  }
  // 演示custom 用处
  const auth = config.custom && config.custom.auth
  if (auth) {
    let token = uni.getStorageSync('token')
    // 如果token不存在，return Promise.reject(config) 会取消本次请求
    if (!token) return Promise.reject('no token!')
    config.header.token = token
  }
  return config
}, (config) => {
  // catch 可使用async await 做异步操作
  return Promise.reject(config)
})

// 响应拦截器 可使用async await 做异步操作
http.interceptors.response.use((response) => {
  // console.log('response', response)
  if (response.data && response.data.code == 403) {
    fastModal(response.data.msg)
  }
  return response.data
}, (response) => {
  // catch 对响应错误做点什么 （statusCode !== 200）*/
  if (response.statusCode === 500) {
    fastToast('网络错误，错误代码：500')
  }
  return Promise.reject(response)
})

export function get(url, params, header = {}, custom = {}) {
  return http.get(url, { params, header, custom })
}

export function post(url, params, header = { 'Content-Type': 'application/json;charset=UTF-8' }, custom = {}) {
  return http.post(url, params, {
    params: {}, /* 会加在url上 */
    header,
    custom,
  })
}

export function upload(url, file) {

  return http.upload(url, {
    // params: {}, /* 会加在url上 */
    file,
    // #ifdef APP-PLUS || H5
    // files, // 需要上传的文件列表。使用 files 时，filePath 和 name 不生效。App、H5（ 2.6.15+）
    // #endif
    // #ifdef MP-ALIPAY
    fileType: 'image/video/audio', // 仅支付宝小程序，且必填。
    // #endif
    // #ifdef MP-WEIXIN
    filePath: file.path || file.tempFilePath, // 要上传文件资源的路径。
    // #endif
    // 注：如果局部custom与全局custom有同名属性，则后面的属性会覆盖前面的属性，相当于Object.assign(全局，局部)
    // custom: {auth: true}, // 可以加一些自定义参数，在拦截器等地方使用。比如这里我加了一个auth，可在拦截器里拿到，如果true就传token
    name: 'file', // 文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容
    header: {},
    /* 会与全局header合并，如有同名属性，局部覆盖全局 */
    formData: {}, // HTTP 请求中其他额外的 form data
    // 返回当前请求的task, options。请勿在此处修改options。非必填
    getTask: (task, options) => {
      // task.onProgressUpdate((res) => {
      //   console.log('上传进度' + res.progress);
      //   console.log('已经上传的数据长度' + res.totalBytesSent);
      //   console.log('预期需要上传的数据总长度' + res.totalBytesExpectedToSend);
      //
      //   // 测试条件，取消上传任务。
      //   if (res.progress > 50) {
      //     uploadTask.abort();
      //   }
      // });
    },
    //validateStatus: (statusCode) => { // statusCode 必存在。此处示例为全局默认配置。演示，非必填选项
    //	return statusCode >= 200 && statusCode < 300
    //}
  })
}
